package com.paul.exception;

import com.paul.response.Resp;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.ConnectException;
import java.util.Date;
import java.util.Map;

/**
 * Created by yangjianbo on 2016/3/7.
 */
@EnableWebMvc
@ControllerAdvice
public class MyExceptionHandler {
   private Logger logger =  Logger.getLogger(MyExceptionHandler.class);

    public MyExceptionHandler(){
        System.out.println("异常拦截初始化");
    }
    /**
     * @Title: operateExp
     * @Description: 全局异常控制，记录日志
     *              任何一个方法发生异常，一定会被这个方法拦截到。然后，输出日志。封装Map并返回给页面显示错误信息：
     *              特别注意：返回给页面错误信息只在开发时才使用，上线后，要把错误页面去掉，只打印log日志即可，防止信息外漏
     * @param: @param ex
     * @param: @param request
     * @return: String
     * @throws:
     */
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map operateExp(RuntimeException ex, HttpServletRequest request) {
        logger.error(ex.getMessage(), ex);
        logger.info("*************RuntimeException ------ 异常信息已记录（" + new Date().toString()+ "） ------- ***********");
        Map map=Resp.JsonResp(Resp.EXCEPTIONSTATUS,null,"系统异常");
        return map;
    }
    /*
     * 记录Ajax异常日志，并将错误Ajax错误信息传递(回写)给前台展示,
     * 前台的jQuery的Ajax请求error中，可以打印错误提示信息   --  data.responseText   : 这里即是后台传递的错误提示
     */
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public Map operateExpAjax(BusinessException ex, HttpServletResponse response) throws IOException {
        logger.error(ex.getMessage(), ex);
        logger.info("*************BusinessException ------ 异常信息已记录（" + new Date().toString()+ "） ------- ***********");
        Map map=Resp.JsonResp(Resp.EXCEPTIONSTATUS,null,"业务异常:"+ex.getErrMsg());
        return map;
    }
    @ExceptionHandler(ConnectException.class)
    @ResponseBody
    public Map operateExpNetException(ConnectException ex, HttpServletResponse response) throws IOException {
        logger.error(ex.getMessage(), ex);
        logger.info("************* ------ 异常信息已记录（" + new Date().toString()+ "） ------- ***********");
        Map map=Resp.JsonResp(Resp.EXCEPTIONSTATUS,null,"网络异常");
        return map;
    }
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Map operateException(Exception ex, HttpServletResponse response) throws IOException {
        logger.error(ex.getMessage(), ex);
        logger.info("*************Exception ------ 异常信息已记录（" + new Date().toString()+ "） ------- ***********");
        Map map=Resp.JsonResp(Resp.EXCEPTIONSTATUS,null,"服务器不稳定");
        return map;
    }
}
